<?php
/**
 * Шаблон постраничного вывода
 * 
 * Помогает в определении общего числа элементов и количества страниц, на которых они должны выводиться
 * 
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */

class Service_ArrayConverter {
  /**
   * Конвертирует обычный двумерный массив в дерево согласно ссылкам данного массива
   *
   * @param array $arrIn - двумерный массив
   * @param string $idName - название идентификатора, например 'ID_in'
   * @param string $rootName - название указателя на корневой элемент, например 'root_in'
   * @return array
   */
public static function convertToTreeArray($arrIn, $idName, $rootName) {
    $arrOut = array();
    $linkArray = array();
    do {
     $changed = false;
     $arrSize = sizeof($arrIn);
     $unsortArray = array();
     for ($i = 0; $i < $arrSize; $i++) {
      $id = $arrIn[$i][$idName];
       $root = $arrIn[$i][$rootName];

       if ($root == null) {
         $arrOut[] = $arrIn[$i];
         $linkArray[$id] = &$arrOut[(sizeof($arrOut) -1)];
         $changed = true;
       }
       else{
         if(isset($linkArray[$root])) {
          $linkArray[$root]['children'][] = $arrIn[$i];
           $linkArray[$id]= &$linkArray[$root]['children'][(sizeof($linkArray[$root]['children']) -1)];
           $changed = true;
         }
         else
           $unsortArray[] = $arrIn[$i];
       }
     }
     $arrIn = $unsortArray;
    } while(sizeof($unsortArray) && $changed);
    return $arrOut;
  }
  
  /**
   * Функция сортирует элементы древовидного массива согласно заданному полю
   *
   * @param array $arrIn - древовидный массив
   * @param string $sortFieldName - поле, по которому следует сортировать
   * @param string $sortType - задание типа сортировки - если 0 - то меньшие значения идут в начало, 1  -  соответсвенно наоборот
   * @return array - отсортированный массив
   */
  public static function sortTreeArray($arrIn, $sortFieldName, $sortType = 0, $lowerCase4Strings = false) {
    $tempSize = sizeof($arrIn);
    for ($i = 0; $i < $tempSize; $i++) // сортируем вложенные массивы
    	if( isset($arrIn[$i]['children']) )
    	  $arrIn[$i]['children'] = self::sortTreeArray($arrIn[$i]['children'], $sortFieldName, $sortType);
    for ($i = 0; $i < $tempSize; $i++) // сортируем основной массив
      for ($j = $i; $j < $tempSize; $j++){
      	if ($sortType == 0) {
      	  if ($lowerCase4Strings) $comp = strtolowerU($arrIn[$j][$sortFieldName]) < strtolowerU($arrIn[$i][$sortFieldName]);
      	  else  $comp = $arrIn[$j][$sortFieldName] < $arrIn[$i][$sortFieldName];
      		if ($comp) {
      		  $temp = $arrIn[$i];
      		  $arrIn[$i] = $arrIn[$j];
      		  $arrIn[$j] = $temp;
      		}
      	}
    	elseif ($sortType == 1){
    	  if ($lowerCase4Strings) $comp = strtolowerU($arrIn[$j][$sortFieldName]) > strtolowerU($arrIn[$i][$sortFieldName]);
      	else $comp = $arrIn[$j][$sortFieldName] > $arrIn[$i][$sortFieldName];
    		if ($comp){
    		  $temp = $arrIn[$i];
    		  $arrIn[$i] = $arrIn[$j];
    		  $arrIn[$j] = $temp;
    		}
    	}
      }
    return $arrIn;
  }
  
  /**
   * Метод вычленяет колонку из двумерного массива
   *
   * @param array $arrIn - двумерный массив
   * @param mixed $columnName - название или номер колонки, которую нужно вернуть
   * @return array - одномерный массив, соответствующий колонке входного
   */
  public static function getColumn($arrIn, $columnName) {
    $arrOut = array();
    $arrSize = sizeof($arrIn);
    for ($i = 0; $i < $arrSize; $i++)
    	$arrOut[$i] = $arrIn[$i][$columnName];
    return $arrOut;
  }
  /**
   * Метод аналогичен методу implode, но обрабатывает одну колонку массива
   *
   * @param ыекштп $glue - разделитель
   * @param array $arrIn - двумерный массив
   * @param mixed $columnName - название или номер колонки, которую нужно вернуть
   * @return array - одномерный массив, соответствующий колонке входного
   */
  public static function implodeColumn($glue, $arrIn, $columnName) {
    $strOut = '';
    $arrSize = sizeof($arrIn);
    if (!$arrSize)
      return $strOut;
    for ($i = 0; $i < $arrSize; $i++)
    	$strOut .= $arrIn[$i][$columnName] . $glue;
    return substr($strOut, 0, -strlen($glue));
  } 
  
  /**
   * функция объединяет и сортирует массивы по полю $sortField
   *
   * @param array $arrInputs - формат array(0=>array1(0=>'', 1=>'', 2=>'', ...), 1=>array2(0=>'', 1=>'', 2=>'', ...), 2=>array3(0=>'', 1=>'', 2=>'', ...) ...)
   */
  public static function mergeAndSortArrays($arrInputs, $sortField, $sortType=0){
  	$arrResult = array();
  	$size = sizeof($arrInputs); // сколько массивов надо объединить
  	for ($i=0; $i<$size; $i++){
  		$arrInSize = sizeof($arrInputs[$i]);
  		for ($j=0; $j<$arrInSize; $j++){
  			$arrResult[] = $arrInputs[$i][$j];
  		}
  	}
  	return self::sortTreeArray($arrResult, $sortField, $sortType);
  }  
  
  
  /*
  public static function addSubArray(&$mainArray, string $idName, &$subArray, string $rootName = 'root', string $subArrayNewName = 'children'){
    $subArraySize = sizeof($subArray);
    $tempArray = array();
    for ($i = 0; $i < $subArraySize; $i++) {
      $tempArray[ $arrQuestionsTags[$i]['ID_essence'] ][]    	
    }
    
    
    $arrSize = sizeof($arrIn);
    $linkArray = array();
    for ($i = 0; $i < $arrSize; $i++) {
      $id = $arrIn[$i][$idName];
      $root = $arrIn[$i][$rootName];

      if($root == NULL){
        $arrOut[] = $arrIn[$i];
        $linkArray[$id] = &$arrOut[(sizeof($arrOut) -1)];
      }
      else{
        $linkArray[$root]['children'][] = $arrIn[$i];
        $linkArray[$id]= &$linkArray[$root]['children'][(sizeof($linkArray[$root]['children']) -1)];
      }
    }
  }*/
}
?>